"""
2025/07/11 16.58 edited by liuXiuChao
需更大文件的测试
文件不可超过10MB   时长为3分钟以内  最大采样率16kHz
支持的格式：(就mp3得了)
da、 wave（ *.wav）、 mp3、wav、aac、flac、ogg、aiff、 au、 mp3、
midi、 wma、 realaudio、 vqf、 oggvorbis、aac、 ape
pip install paddlenlp
pip install paddlepaddle
pip install pydub python-magic-bin
"""
from langchain_core.prompts import ChatPromptTemplate
import os
from dashscope import MultiModalConversation
import dashscope
from langchain_openai import ChatOpenAI
from multi_modal.public import get_tongyi_api
from loguru import logger
import magic
from pydub import AudioSegment


def audio_to_text(audio_absolute_path: str) -> str | None:
    """
    将音频文件转换为文本，增加了文件健壮性检查

    参数:
        audio_absolute_path: 音频文件的绝对路径

    Returns:
        转录后的文本，如果转录失败或文件不符合要求则返回None
    """
    # 文件存在性检查
    if not os.path.exists(audio_absolute_path):
        logger.debug("错误：文件不存在")
        return None

    # 文件格式检查
    mime = magic.Magic(mime=True)
    file_type = mime.from_file(audio_absolute_path)
    if not file_type.startswith('audio/'):
        logger.debug("错误：请上传语音文件")
        return None

    # 文件大小检查 (10MB限制)
    file_size_mb = os.path.getsize(audio_absolute_path) / (1024 * 1024)
    if file_size_mb > 10:
        logger.debug(f"错误：文件大小不能超过10MB，当前文件大小：{file_size_mb:.2f}MB")
        return None

    try:
        # 尝试加载音频文件以检查其属性
        audio = AudioSegment.from_file(audio_absolute_path)

        # 检查音频长度 (3分钟限制 = 180秒)
        duration_seconds = len(audio) / 1000
        if duration_seconds > 180:
            logger.debug(f"错误：音频长度不能超过3分钟，当前长度：{duration_seconds / 60:.2f}分钟")
            return None

        # 检查采样率
        sample_rate = audio.frame_rate
        if sample_rate > 16000:
            logger.debug(f"警告：音频采样率高于16kHz，当前采样率：{sample_rate}Hz，将进行降采样")
            audio = audio.set_frame_rate(16000)
            temp_path = f"{audio_absolute_path}_temp.wav"
            audio.export(temp_path, format="wav")
            audio_absolute_path = temp_path

        # 检查是否为静音文件
        if audio.dBFS < -50:  # 非常低的音量阈值
            logger.debug("警告：未检测到明显的语音内容")

    except Exception as e:
        logger.debug(f"错误：音频文件分析失败 - {str(e)}")
        return None

    # 确保API密钥已设置
    api_key = get_tongyi_api()
    dashscope.api_key = api_key
    os.environ['DASHSCOPE_API_KEY'] = api_key

    # 获取音频文件的绝对路径
    audio_file_path = f"file://{audio_absolute_path}"

    try:
        # 准备请求消息
        messages = [
            {
                "role": "user",
                "content": [{"audio": audio_file_path}],
            }
        ]

        logger.debug('开始音频转文字...')
        # 调用API进行音频转文字
        response = MultiModalConversation.call(model="qwen-audio-asr-latest", messages=messages)

        # 清理临时文件
        if audio_absolute_path.endswith("_temp.wav"):
            try:
                os.remove(audio_absolute_path)
            except:
                pass

        # 处理响应结果
        if response.status_code == 200:
            # 提取转录文本
            if response.output and response.output.get('choices'):
                transcribed_text = response.output['choices'][0]['message']['content']
                logger.debug('音频转文字成功!')
                # 直接使用文件中定义的get_text函数
                return get_text(transcribed_text[0]['text'])
            else:
                logger.debug("响应格式异常，无法提取转录文本")
                return None
        else:
            logger.debug(f"请求失败，状态码: {response.status_code}")
            return None

    except Exception as e:
        logger.debug(f"处理过程中出现错误: {str(e)}")
        return None


def get_text(raw_text: str) -> str:
    model = ChatOpenAI(
        model="qwen-turbo-latest",
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        api_key=get_tongyi_api(),
    )
    chat_template = ChatPromptTemplate([
        ("system",
         "你是一个资深的中文专家，擅长把没有标点的中文加上正确的标点符号。你只会返回一句加了标点的中文，不会返回其他任何内容"),
        ("user", "为下面这句话加上标点：{text}")
    ])
    messages = chat_template.invoke({"text": raw_text})
    # print(messages)
    ai_message = model.invoke(messages)
    return ai_message.content


if __name__ == "__main__":
    # 测试音频转文字功能
    transcribed_text = audio_to_text("E:/studyFiles/code/pycharm/he_lin_group/multi_modal/res/XinWen.mp3")
    print(f"{transcribed_text}")
